home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS Toolkit
/
BBS Toolkit.iso
/
doors_2
/
twview91.zip
/
PORTDISP.INC
< prev
next >
Wrap
Text File
|
1992-03-11
|
9KB
|
256 lines
function compatible( i1, i2 : stuff; greed : boolean ) : boolean;
{ if each sells something the other buys; if greed is true, only org/equip
trades. }
begin
if i2 = -1 then
compatible := false
else if not greed then
case i1 of
Class0, 0, 7 : compatible := false;
1 : compatible := i2 in [2, 4, 6];
2 : compatible := i2 in [1, 4, 5];
3 : compatible := i2 in [4, 5, 6];
4 : compatible := i2 in [1, 2, 3];
5 : compatible := i2 in [2, 3, 6];
6 : compatible := i2 in [1, 3, 5];
end {case}
else
case i1 of
Class0, 0, 1, 6, 7 : compatible := false;
2, 3 : compatible := i2 in [4,5];
4, 5 : compatible := i2 in [2,3];
end; {case}
end;
function deal( good1, good2 : stuff ) : string;
{ Port type "good1" selling to port type "good2" }
const
ND = 'no deal';
F = 'Fuel Ore';
O = 'Organics';
Q = 'Equipment';
any = 'anything';
begin
deal := ND;
case good1 of
Class0, 0 : ; {error}
1 : if good2 in [0,2,4,6] then deal := F;
2 : if good2 in [0,1,4,5] then deal := O;
3 : if good2 in [0,4] then deal := O + ' or ' + F
else if good2 in [1,5] then deal := O
else if good2 in [2,6] then deal := F;
4 : if good2 in [0,1,2,3] then deal := Q;
5 : if good2 in [0,2] then deal := Q + ' or ' + F
else if good2 in [1,3] then deal := Q
else if good2 in [4,6] then deal := F;
6 : if good2 in [0,1] then deal := Q + ' or ' + O
else if good2 in [2,3] then deal := Q
else if good2 in [4,5] then deal := O;
7 : case good2 of
Class0,7 : ; {error}
0 : deal := any;
1 : deal := Q + ' or ' + O;
2 : deal := Q + 'or ' + F;
3 : deal := Q;
4 : deal := O + ' or ' + F;
5 : deal := O;
6 : deal := F;
end; {case 7}
end; {case}
end; {deal}
function letterOfGood( g : goods ) : char;
begin
case g of
fuel : LetterOfGood := 'F';
Organics : LetterOfGood := 'O';
Equipment : LetterOfGood := 'E';
end; {case}
end; {letterOfGood}
procedure ComputeStores( psell, pbuy : PortIndex; var f : real;
which : goods; dump : boolean; var into : text);
var
level1, level2 : integer;
mss : string;
begin
level1 := space.ports.data[ psell ].amts[ which ];
level2 := space.ports.data[ pbuy ].amts[ which ];
mss := letterOfGood( which ) + ':' + str( level1, 5) + ' to ' +
str( level2, 4) + ' ';
write( mss );
if dump then
write( into, mss );
f := -minreal( -f, -minreal( level1, -level2 ) );
end; {ComputeStores}
procedure DisplayStores( psell, pbuy : PortIndex; s : string;
var f : real;
EOonly, Dump : boolean; var T : text );
{ we are given two ports, and a string s that represents the goods we are
going to be trading there. For each good in s compute the minimum of
the stores we have to sell and amount to purchase, and store the maximum in f,
while also displaying the quantities the port holds. }
begin
f := 0;
if not EOonly then
if pos( 'Fuel', s ) > 0 then
ComputeStores( psell, pbuy, f, Fuel, Dump, t );
if pos( 'Organic', s ) > 0 then
ComputeStores( psell, pbuy, f, Organics, Dump, t );
if pos( 'Equip', s ) > 0 then
ComputeStores( psell, pbuy, f, Equipment, Dump, t );
end; {DisplayStores}
procedure PortTradeFactor( s1, s2 : sector;
items12, items21 : string;
EOonly, FileDump : boolean;
var DumpFile : text );
{ Print port information from these two ports corresponding to trading
items from 1 to 2 and from 2 to 1; compute relative factor. }
var
p1, p2 : PortIndex;
factor1, factor2 : real;
line : string;
begin
p1 := PortNumber( s1 );
p2 := PortNumber( s2 );
if (p1 = 0) or (p2 = 0) then
begin
if p1 = 0 then
line := 'No info available for ' + str( s1 , 1)
else if p2 = 0 then
line := 'No info available for ' + str( s2, 1 );
writeln( line );
if Filedump then
writeln( Dumpfile, line );
end
else
begin
write( 'Quantities: ' );
if FileDump then
write(DumpFile, 'Quantities: ');
DisplayStores( p1, p2, items12, factor1, EOonly, FileDump, DumpFile);
DisplayStores( p2, p1, items21, factor2, EOonly, FileDump, DumpFile);
writeln(' Factor: ', round( sqrt( factor1 * factor2 ) ) );
if FileDump then
writeln(DumpFile,' Factor: ', round( sqrt( factor1 * factor2 ) ) );
end; {else}
end; {PortTradeFactor}
procedure AddEtc( s : sector; var line : string );
{ add special information to code Fighters there or SpaceLane there }
var
p : PortIndex;
begin
if space.sectors[s].etc and HasFighters <> nothing then
line := line + 'F'
else if space.sectors[s].etc and SpaceLane <> nothing then
line := line + 'SL';
p := PortNumber( s );
if p <> 0 then
with space.ports do
if (data[ p ].amts[equipment] <> 0) and
(data[p].usage[equipment]=0) then
line := line + 'B';
end; {AddEtc}
procedure DisplayLotsOfPortStuff( s, s1, WhichDistanceIndex : sector;
logging, AsciiDump, showLevels, EquipOnly : boolean;
var f, h : text);
var
g, g1 : stuff;
line : string;
begin
if logging then
begin
writeln( h, 'R', s );
writeln( h, 'R', s1);
end; {log}
g := space.sectors[s].portType;
g1 := space.sectors[s1].portType;
line := '(' + str( s, 3);
AddEtc( s, line );
line := line + ' & ' + str(s1,3);
AddEtc( s1, line );
line := line + ' ) at distance ' + str( distances[WhichDistanceIndex].d,3)
+ ' trading ' + deal( g, g1) + ' for ' +
deal( g1, g );
writeln( line );
if AsciiDump then
writeln( f, line );
if ShowLevels then
PortTradeFactor( s, s1, deal( g, g1), deal( g1, g ),
EquipOnly, AsciiDump, f );
end; {Display Lots of Port Stuff}
procedure SearchPairs( NumPorts : integer;
logging : boolean; var h : text;
asciiDump : boolean; var f : text;
EquipOnly, ShowLevels : boolean );
var
i : integer;
s, s1 : sector;
g, g1 : stuff;
t : warpIndex;
NumPairs : integer;
PauseAt : integer;
line : string;
begin
NumPairs := 0;
if ShowLevels then
PauseAt := 10
else
PauseAt := 20;
for i := 1 to NumPorts do
begin
s := distances[ i ].s;
g := space.sectors[s].portType;
if space.sectors[s].number <> Unexplored then
for t := 1 to space.sectors[s].number do
begin
s1 := space.sectors[s].data[t];
g1 := space.sectors[s1].porttype;
if (g1<> NotAPort) and (g < g1) and IsWarp( s1, s) then
{ must be a port; print only once; check if can get back }
if compatible( g, g1, EquipOnly ) then
begin
DisplayLotsOfPortStuff(s, s1, i, logging, asciidump,
showlevels, EquipOnly, f, h);
NumPairs := NumPairs + 1;
if numPairs mod PauseAt = 0 then
if not prompt('more? ') then
exit;
end; {if if}
end; {for t}
end; {for i}
end; {SearchPairs}
procedure pairport;
var
s : sector;
QuantInfo,
Greedy : boolean;
NumSectors : integer;
AsciiDump,
loggit : boolean;
h, fp : text;
begin
SortPorts( NumSectors );
SortDistances( distances, NumSectors );
QuantInfo := prompt('Do you want to see port quantity information? ');
greedy := prompt('Do you want to only see Equip/Organic trades? ');
loggit := LogToDisk( h,
'Do you want to log the results in a format suitable for upload? ',
BBSname+'.upl' );
AsciiDump := LogToDisk( fp,
'Do you want an echo of the results to an ascii file? ',
BBSName+'.txt');
SearchPairs( NumSectors, Loggit, h, AsciiDump, fp, greedy, QuantInfo );
if loggit then
close( h );
if AsciiDump then
close( fp );
end; {pair ports}